//
// Copyright (c) 2011 Alex Nesterenko
//

#include "nane/WindowSystem/X11/X11WindowSystem.h"
#include "nane/WindowSystem/X11/X11Window.h"

namespace nane
{
    ////////////////////////////////////////////////////////////////////////////////////////////////
//    static int errorHandler( Display* _display, XErrorEvent* _errorEvent )
//    {
//        int a;
//        a = 0;
//        return 0;
//    }
//    ////////////////////////////////////////////////////////////////////////////////////////////////
//    static int ioErrorHandler( Display* _display )
//    {
//        int a;
//        a = 0;
//        return 0;
//    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    X11WindowSystem::X11WindowSystem()
        : m_display( NULL )
        , m_colorBlack( 0 )
        , m_colorWhite( -1 )
        , m_deleteWindowAtom( 0 )
    {

    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    X11WindowSystem::~X11WindowSystem()
    {

    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    bool X11WindowSystem::initialize()
    {
        m_display = XOpenDisplay(NULL);
        //XSetErrorHandler(errorHandler);
        //XSetIOErrorHandler(ioErrorHandler);
        if( m_display != NULL )
        {
          m_colorBlack = BlackPixel(m_display, DefaultScreen(m_display));
          m_colorWhite = WhitePixel(m_display, DefaultScreen(m_display));
          m_deleteWindowAtom = XInternAtom(m_display, "WM_DELETE_WINDOW", True);
        }
        return m_display != NULL;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    void X11WindowSystem::shutdown()
    {
        if( m_display != NULL )
        {
            XCloseDisplay(m_display);
            m_display = NULL;
        }
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    IWindow* X11WindowSystem::createWindow( const char* _title, uint32 _width, uint32 _height, uint32 _posX, uint32 _posY )
    {
        X11Window* x11Window = NULL;
        Window hWindow = XCreateSimpleWindow(m_display, DefaultRootWindow(m_display), _posX, _posY, _width, _height, 0, m_colorBlack, m_colorBlack);
        XSetWMProtocols(m_display, hWindow, &m_deleteWindowAtom, 1);
        XStoreName(m_display, hWindow, _title);
        XSelectInput(m_display, hWindow, StructureNotifyMask);
        x11Window = new X11Window(m_display, hWindow, m_deleteWindowAtom);
        return x11Window;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    void X11WindowSystem::releaseWindow( IWindow* _window )
    {
        X11Window* x11Window = static_cast<X11Window*>(_window);
        if( x11Window != NULL )
        {
            Window hWindow = reinterpret_cast<Window>(x11Window->getOSHandle());
            delete x11Window;
            XDestroyWindow(m_display, hWindow);
        }
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    uint32 X11WindowSystem::getScreenWidth()
    {
        return static_cast<uint32>(XDisplayWidth(m_display, DefaultScreen(m_display)));
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    uint32 X11WindowSystem::getScreenHeight()
    {
        return static_cast<uint32>(XDisplayHeight(m_display, DefaultScreen(m_display)));
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
}   // namespace nane
